/**
 * 
 * This is an abstract class for any one character.
 * 
 */
package com.rpg.battle;

import java.io.InputStream;

import com.rpg.Drawable_I;
import com.rpg.R;

import android.content.Context;
import android.content.res.Resources.NotFoundException;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.CountDownTimer;
import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
import android.view.MotionEvent;

/**
 * @author christ66
 *
 */

//TODO: Remove this unused warning in near future. Next step is to implement statuses for every character
@SuppressWarnings("unused") 
public class IndividualCharacter implements Drawable_I {
	public IndividualCharacter(Context context, int id, int hp, int mp) {
		this.context = context;
		imageID = id;
		totalHitPoints = hitPoints = hp;
		manaPower = mp;
		characterState = new CharacterState();
		InputStream is = context.getResources().openRawResource(id);  
		character = Movie.decodeStream(is);
		x = y = 100;
		ATTACKPAINT.setARGB(255, 137, 207, 240);
	}
	
	public void setStartPosition(int x, int y) {
		this.x = startx = x;
		this.y = starty = y;
		
	}
	
	private void moveToAttacked() {
		if (attacked != null) {
			if (x > attacked.x) {
				x-=2;
			}
			else if (x < attacked.x) {
				x+=2;
			}
			
			if (y > attacked.y) {
				y-=2;
			}
			else if (y < attacked.y) {
				y+=2;
			}
			
			if (x == attacked.x && y == attacked.y) {
				x = startx;
				y = starty;
				readyToAttack = false;
				attacking = false;
				Log.d("IndividualCharacter", hitPoints + " / " + totalHitPoints);
				attacked.inflictDamage(attackDamage);
				startTimer();
				attacked = null;
			}
		}
	}
	
	public int getAttackDamage() {
		return attackDamage;
	}
		
	public void onDraw(Canvas canvas) {
		 long now = android.os.SystemClock.uptimeMillis();  
		
		 int relTime = (int)(now % character.duration()) ;
		 
		 character.setTime(relTime);
		 
		 if (readyToAttack && !attacking) {
			 canvas.drawOval(new RectF(x, y + (character.height() / 2), x + character.width(), y + character.height()), ATTACKPAINT);
		 }
		 
		 if (attacking) {
			 moveToAttacked();
		 }		 
		 
		 character.draw(canvas, x, y);
	}
	
	public void inflictDamage(int damage) {
			hitPoints -= damage;
		if (hitPoints <= 0) {
			hitPoints = 0;
			changeSprite(R.drawable.cronodead);
			System.out.println("Character died!");
		}
	}
	
	private void changeSprite(int id) {
		try {
			InputStream is = context.getResources().openRawResource(id);  
			character = Movie.decodeStream(is);
		}
		catch (NotFoundException e) {
			System.out.println("Character" + id + " not found.");
			e.printStackTrace();
		}
	}
	
	/*
	 * Start the timer before they are able to attack.
	 */
	public void startTimer() {
			new CountDownTimer(5000, 10000) {

				@Override
				public void onFinish() {
					readyToAttack = true;
				}

				@Override
				public void onTick(long millisUntilFinished) {
					// TODO Auto-generated method stub
				}
				
			}.start();
	}
	
	public boolean getReadyToAttack() {
		return readyToAttack;
	}
	
	public void attack(IndividualCharacter attacked) {
		attacking = true;
		this.attacked = attacked;
	}
	
	public void setAttacked(IndividualCharacter attacked) {
		this.attacked = attacked;
	}

	
	
	Context context;
	
	IndividualCharacter attacked;
	Movie character;
	private boolean readyToAttack = false; 
	private boolean attacking = false;
	private int x, y, startx, starty;
	private int attackDamage = 10;
	private int imageID;
	private int totalHitPoints;
	private int manaPower;
	private CharacterState characterState;
	private int time;
	private int hitPoints;
	private final Paint ATTACKPAINT = new Paint();
	public boolean gotTouched(MotionEvent event) {
		if ((int)event.getX() > x - 50 && (int)event.getX() < x + 50 &&
				(int)event.getY() > y - 50 && (int)event.getY() < y + 50 && hitPoints != 0) {
			System.out.println("Someone got touched");
			return true;
		}
		return false;
	}

	public void prepareForAttack() {
		// TODO Auto-generated method stub
		attacking = true;
	}
}
